//----------------------搭建服务器-------------------------------------
//引入express
const express = require('express');
//实例化服务器
let app = express()
//导入请求参数解析器
//引入formData解析器
const multiparty = require('multiparty')
//引入文件读取fs
const fs = require('fs')
let bodyparser = require('body-parser')
//托管静态文件夹
app.use('/uploads',express.static('./uploads'))//大坑：第一个参数放/，第二个参数才加点
const { users } = require('./03insert_users');
const { articles } = require('./03insert_articles');
const { _class } = require('./03insert_class');
const { comments } = require('./03insert_comments');
const { notes } = require('./03insert_notes');
const { orders } = require('./03insert_orders'); 
const { dates } = require('./03insert_dates'); 

// 定义 orders 和 users 之间的关联关系
orders.belongsTo(users, { foreignKey: 'doctor',targetKey:'username', as:"doctorInfo" });
// //配置解析post的请求参数 json格式
app.use(bodyparser.urlencoded({extended:true}))
app.use(bodyparser.json())
//引入
const node_uuid = require('node-uuid')


const baseUrl = 'http://127.0.0.1:8001'
const cors = require("cors")
// 开发环境设置，生产环境需要配置安全的参数
app.use(cors());
app.all('*', function(req, res, next) {
    console.log('执行了',req.url);
    next();
})

const renameFile = (oldPath,newPath)=>{
    fs.rename(oldPath,newPath,(err)=>
    {
        if(err){
            console.log('文件重命名失败',err);
        }else{
            console.log('文件重命名成功');
        }
    })
}
const getUUID = (type,num)=>{
    const _type = type || 'str'
    const _num = num || 6
    if (_type == 'str') {
        return node_uuid().replace(/-/g, ''); // 去除横线-
    }else{
        return BigInt(`0x${node_uuid().replace(/-/g, '')}`).toString().slice(0, _num);
    }

}
// get查询-----------------------------------------------------------------------------
// 获取全部普通用户数据
app.get("/",(req,res)=>{
    res.send('ok')
})

app.get("/users",(req,res)=>{
    users.
    findAll().then(val=>{
        res.send({
            message:'获取成功',
            code:200,
            data:val
        }) 
    })
})
app.get("/dates",(req,res)=>{
    dates.
    findAll().then(val=>{
        res.send({
            message:'获取成功',
            code:200,
            data:val
        }) 
    })
})
app.get("/articles",(req,res)=>{
    articles.
    findAll().then(val=>{
        res.send({
            message:'获取成功',
            code:200,
            data:val
        }) 
    })
})
app.get("/class",(req,res)=>{
    _class.
    findAll().then(val=>{
        res.send({
            message:'获取成功',
            code:200,
            data:val
        }) 
    })
})
app.get("/comments",(req,res)=>{
    comments.
    findAll().then(val=>{
        res.send({
            message:'获取成功',
            code:200,
            data:val
        }) 
    })
})
app.get("/notes",(req,res)=>{
    notes.
    findAll().then(val=>{
        res.send({
            message:'获取成功',
            code:200,
            data:val
        }) 
    })
})
app.get("/orders",(req,res)=>{
    orders.
    findAll({
        include: [
          {
            model: users,
            attributes: ['position'],
            as: 'doctorInfo' // 给关联表取的别名
          }
        ]
      }).then(val=>{
        res.send({
            message:'获取成功',
            code:200,
            data:val
        }) 
    }).catch(err=>{
        console.log(err);
    })
})


// post查询-----------------------------------------------------------------------------
//查询一名用户
app.post("/users",(req,res)=>{
    users.findOne({
        where:req.body
    }).then(val =>{
        res.send({
        code:200,
        message:'查询成功',
        data:val
    })
    }).catch(err =>{
        res.send({
            code:400,
            message:`执行失败:${err}`,
        })
    })
})

//登录
app.post("/users/login",(req,res)=>{
    users
    .findOne({
       where:{
            user:req.body.user,
       }
    }).then(val =>{
        console.log(val.user,val.password);
         //先判定一下该用户是否已被注册
         if (val.user != req.body.user) {
            res.send({
                code:400,
                message:`登录失败，用户 ${req.body.user} 不存在`,
            })
        } else{
            // 如果没有则校验密码
            if (req.body.password == val.password) {
                res.send({
                    code:200,
                    message:'登录成功',
                    data:val
                })
            }else{
                res.send({
                    code:401,
                    message:'密码无效',
                })
            }
        }
    }).catch(err =>{
        res.send({
            code:400,
            message:`执行失败:${err}`,
        })
    })
})

// --------------------------------------------------------------插入
//新增用户信息（插入版，有头像）
app.post("/users/insert", (req,res)=>{
    var form = new multiparty.Form({uploadDir:`./uploads`})
    form.parse(req,(err,field,files)=>{ 
        if(err){  
            res.send(code=400,`执行失败${err}`)
            return;
        }else{
            // 01.创建一个接收对象的变量
            var updateObject = {}
            //02.解析额外参数
            if (field.form != undefined) {
                updateObject = JSON.parse(field.form)
            }

            if (files.file != undefined) {
                //重新命名该文件
                renameFile(files.file[0].path,`./uploads/${files.file[0].originalFilename}`)
                updateObject.tx = baseUrl + '/uploads/'+  files.file[0].originalFilename
            }
            updateObject.id =  getUUID('num',6)
            //03.
            console.log('所更新的数据',updateObject);
            users.
            create(updateObject).then( val =>{ 
                res.send({
                    message:`添加成功`, 
                    code:200,
                    data:val
                })
            }).catch( err =>{
                res.send({
                    code:400,
                    message:`执行失败，错误信息:${err}`,
                })
            })
        }
    })

})



//新增用户信息（注册版）
app.post("/users/register", (req,res)=>{
    users.findOne({
        where:{
            user:req.body.user
            }
        }).then(val =>{
            //先判定一下该用户是否已被注册
            if (val != null) {
                res.send({
                    code:400,
                    message:`注册失败，用户 ${req.body.user} 已存在！`,
                })
            } else{
                // 如果没有则正常注册
                req.body.id = getUUID()
                req.body.username == undefined?req.body.username = req.body.user:null; // 用户名默认为用户名
                console.log('用户信息',req.body);
                users.
                    create(req.body).then(val1=>{
                    res.send({
                        code:200,
                        message:`用户${val1.username}注册成功！`,
                        //返回用户信息及身份所需token
                        data:val1
                    })
                }).catch( err =>{
                    res.send({
                        code:400,
                        message:`注册失败，错误信息:${err}`,
                    })
                })//注册
            
            }
    }) //查找用户
})
// 添加文章
app.post("/articles/insert",(req,res)=>{
    var form = new multiparty.Form({uploadDir:`./uploads`})
    form.parse(req,(err,field,files)=>{ 
        if(err){  
            res.send(code=400,`执行失败${err}`)
            return;
        }else{
            // 01.创建一个接收对象的变量
            var updateObject = {}
            //02.解析额外参数
            if (field.form != undefined) {
                updateObject = JSON.parse(field.form)
            }

            if (files.file != undefined) {
                //重新命名该文件
                renameFile(files.file[0].path,`./uploads/${files.file[0].originalFilename}`)
                updateObject.img = baseUrl + '/uploads/'+  files.file[0].originalFilename
            }
            updateObject.id =  getUUID('num',6)
            //03.
            console.log('所更新的数据',updateObject);
            articles.
            create(updateObject).then( val =>{ 
                res.send({
                    message:`添加成功`, 
                    code:200,
                    data:val
                })
            }).catch( err =>{
                res.send({
                    code:400,
                    message:`执行失败，错误信息:${err}`,
                })
            })
        }
    })
})
// 发送评论
app.post("/comments/insert",(req,res)=>{
    comments
    .create(req.body).then(val=>{
        res.send({
            message:`添加成功`, 
            code:200,
            data:val
        })
    }).catch(err=>{
        res.send({
            code:400,
            message:`执行失败，错误信息:${err}`,
        })
    })
})
app.post("/dates/insert",(req,res)=>{
    dates
    .create(req.body).then(val=>{
        res.send({
            message:`签到成功`, 
            code:200,
            data:val
        })
    }).catch(err=>{
        res.send({
            code:400,
            message:`执行失败，错误信息:${err}`,
        })
    })
})
// 添加科室
app.post("/class/insert",(req,res)=>{
    var form = new multiparty.Form({uploadDir:`./uploads`})
    form.parse(req,(err,field,files)=>{ 
        if(err){  
            res.send(code=400,`执行失败${err}`)
            return;
        }else{
            // 01.创建一个接收对象的变量
            var updateObject = {}
            //02.解析额外参数
            if (field.form != undefined) {
                updateObject = JSON.parse(field.form)
            }

            if (files.file != undefined) {
                //重新命名该文件
                renameFile(files.file[0].path,`./uploads/${files.file[0].originalFilename}`)
                updateObject.img = baseUrl + '/uploads/'+  files.file[0].originalFilename
            }
            //03.
            console.log('所更新的数据',updateObject);
            _class.
            create(updateObject).then( val =>{ 
                res.send({
                    message:`添加成功`, 
                    code:200,
                    data:val
                })
            }).catch( err =>{
                res.send({
                    code:400,
                    message:`执行失败，错误信息:${err}`,
                })
            })
        }
    })
})
// 添加公告
app.post("/notes/insert",(req,res)=>{
    notes
    .create(req.body).then(val=>{
        res.send({
            message:`添加成功`, 
            code:200,
            data:val
        })
    }).catch(err=>{
        res.send({
            code:400,
            message:`执行失败，错误信息:${err}`,
        })
    })
})
// 添加订单
app.post("/orders/insert",(req,res)=>{
    req.body.id = getUUID('num',10)
    orders
    .create(req.body).then(val=>{
        res.send({
            message:`添加成功`, 
            code:200,
            data:val
        })
    }).catch(err=>{
        res.send({
            code:400,
            message:`执行失败，错误信息:${err}`,
        })
    })
})
// --------------------------------------------------------------删除
//删除用户
app.post("/users/delete",(req,res)=>{
    users.
    findOne({
        where:{
            id:req.body.id,
        }
    }).then(val=>{
        val.destroy()
        //删除之后保存一下
        val.save()
        res.send({
            message:`删除成功`,
            code:200,
        })
    }).catch( err =>{
        res.send({
            code:400,
            message:`执行失败，错误信息:${err}`,
        })
    })
})
 // 删除文章
app.post("/articles/delete",(req,res)=>{
    articles.
    findOne({
        where:{
            id:req.body.id,
        }
    }).then(val=>{
        val.destroy()
        //删除之后保存一下
        val.save()
        res.send({
            message:`删除成功`,
            code:200,
        })
    }).catch( err =>{
        res.send({
            code:400,
            message:`执行失败，错误信息:${err}`,
        })
    })
})
// 删除评论
app.post("/comments/delete",(req,res)=>{
    comments.
    findOne({
        where:{
            id:req.body.id,
        }
    }).then(val=>{
        val.destroy()
        //删除之后保存一下
        val.save()
        res.send({
            message:`删除成功`,
            code:200,
        })
    }).catch( err =>{
        res.send({
            code:400,
            message:`执行失败，错误信息:${err}`,
        })
    })
})
// 删除药方
app.post("/class/delete",(req,res)=>{
    _class.
    findOne({
        where:{
            id:req.body.id,
        }
    }).then(val=>{
        val.destroy()
        //删除之后保存一下
        val.save()
        res.send({
            message:`删除成功`,
            code:200,
        })
    }).catch( err =>{
        res.send({
            code:400,
            message:`执行失败，错误信息:${err}`,
        })
    })
})
// --------------------------------------------------------------更新

//更新用户信息
app.post("/users/update/upload",(req,res)=>{
    // req.headers['content-type'] = {"content-type": "multipart/form-data"}
    var form = new multiparty.Form({uploadDir:`./uploads`})
    form.parse(req,(err,field,files)=>{ 
        if(err){  
            res.send(code=400,`执行失败${err}`)
        }else{
            console.log(files);
            console.log(field);
            // 01.创建一个接收对象的变量  
            var updateObject = {}
            //02.解析额外参数 
            if (field.id != undefined) {
                for (const key in field) {
                    updateObject[key] = field[key][0]
                }
                console.log(updateObject);
            }

            if (files.file != undefined) {
                //重新命名该文件
                renameFile(files.file[0].path,`./uploads/${files.file[0].originalFilename}`)
                updateObject.tx = baseUrl + '/uploads/'+  files.file[0].originalFilename
            }
            //03.
            console.log('所更新的数据',updateObject);
            users.
            update(updateObject,{where:{
                id:updateObject.id,
            }}).then( val =>{ 
                res.send({
                    message:`添加成功`, 
                    code:200,
                    data:val
                })
            }).catch( err =>{
                res.send({
                    code:400,
                    message:`执行失败，错误信息:${err}`,
                })
            })
        }
    }) 
      
})

//更新科室
app.post("/class/update",(req,res)=>{   
    var form = new multiparty.Form({uploadDir:`./uploads`})
    form.parse(req,(err,field,files)=>{ 
        if(err){  
            console.log('报错了 吗：',err);
            res.send(code=400,`执行失败${err}`)
        }else{
            // 01.创建一个接收对象的变量  
            var updateObject = {}
            //02.解析额外参数 
            if (field.form != undefined) {
                updateObject = JSON.parse(field.form)
            }

            if (files.file != undefined) {
                //重新命名该文件
                renameFile(files.file[0].path,`./uploads/${files.file[0].originalFilename}`)
                updateObject.img = baseUrl + '/uploads/'+  files.file[0].originalFilename
            }
            //03.
            console.log('所更新的数据',updateObject);
            _class.
            update(updateObject,{where:{
                id:updateObject.id,
            }}).then( val =>{ 
                res.send({
                    message:`添加成功`, 
                    code:200,
                    data:val
                })
            }).catch( err =>{
                res.send({
                    code:400,
                    message:`执行失败，错误信息:${err}`,
                })
            })
        }
    })
    
})

//更新文章
app.post("/articles/update",(req,res)=>{   
    var form = new multiparty.Form({uploadDir:`./uploads`})
    form.parse(req,(err,field,files)=>{ 
        if(err){  
            console.log('报错了 吗：',err);
            res.send(code=400,`执行失败${err}`)
        }else{
            // 01.创建一个接收对象的变量  
            var updateObject = {}
            //02.解析额外参数 
            if (field.form != undefined) {
                updateObject = JSON.parse(field.form)
            }

            if (files.file != undefined) {
                //重新命名该文件
                renameFile(files.file[0].path,`./uploads/${files.file[0].originalFilename}`)
                updateObject.img = baseUrl + '/uploads/'+  files.file[0].originalFilename
            }
            //03.
            console.log('所更新的数据',updateObject);
            articles.
            update(updateObject,{where:{
                id:updateObject.id,
            }}).then( val =>{ 
                res.send({
                    message:`添加成功`, 
                    code:200,
                    data:val
                })
            }).catch( err =>{
                res.send({
                    code:400,
                    message:`执行失败，错误信息:${err}`,
                })
            })
        }
    })
    
})
//更新用户信息（不带头像版）
app.post("/users/update",(req,res)=>{   
    console.log('用户信息更新：',req.body);
    users.
    update(req.body,{
        where:{
            id:req.body.id,
        }
    }).then( val =>{
        res.send({
            message:'更新成功',
            code:200,
            data:val
        })
    }).catch( err =>{
        res.send({
            code:400,
            message:`执行失败，错误信息:${err}`,
        })
    })    
})
//更新公告
app.post("/notes/update",(req,res)=>{   
    notes.
    update(req.body,{
        where:{
            id:req.body.id,
        }
    }).then( val =>{
        res.send({
            message:'更新成功',
            code:200,
            data:val
        })
    }).catch( err =>{
        res.send({
            code:400,
            message:`执行失败，错误信息:${err}`,
        })
    })    
})
app.post("/dates/update",(req,res)=>{   
    dates.
    update(req.body,{
        where:{
            id:req.body.id,
        }
    }).then( val =>{
        res.send({
            message:'签到成功',
            code:200,
            data:val
        })
    }).catch( err =>{
        res.send({
            code:400,
            message:`执行失败，错误信息:${err}`,
        })
    })    
})
//更新订单
app.post("/orders/update",(req,res)=>{   
    orders.
    update(req.body,{
        where:{
            id:req.body.id,
        }
    }).then( val =>{
        res.send({
            message:'更新成功',
            code:200,
            data:val
        })
    }).catch( err =>{
        res.send({
            code:400,
            message:`执行失败，错误信息:${err}`,
        })
    })    
})

// --------------------------------------------------------------上传图片
app.get("/uploads",(req,res)=>{
    res.send({
        code:200,
        message:'上传成功',
    })
})


process.on('unhandledRejection', (reason, p) => {
    console.log('Promise: ', p, 'Reason: ', reason)
    // do something
  })

app.listen(8001,()=>{
    console.log('服务器已经启动');
})


